
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import { __extends } from 'tslib';
import * as zrUtil from 'zrender/lib/core/util.js';
import ChartView from '../../view/Chart.js';
import SunburstPiece from './SunburstPiece.js';
import DataDiffer from '../../data/DataDiffer.js';
import { ROOT_TO_NODE_ACTION } from './sunburstAction.js';
import { windowOpen } from '../../util/format.js';

var SunburstView =
/** @class */
function (_super) {
	__extends(SunburstView, _super);

	function SunburstView() {
		var _this = _super !== null && _super.apply(this, arguments) || this;

		_this.type = SunburstView.type;
		return _this;
	}

	SunburstView.prototype.render = function (seriesModel, ecModel, api, // @ts-ignore
		payload) {
		var self = this;
		this.seriesModel = seriesModel;
		this.api = api;
		this.ecModel = ecModel;
		var data = seriesModel.getData();
		var virtualRoot = data.tree.root;
		var newRoot = seriesModel.getViewRoot();
		var group = this.group;
		var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData');
		var newChildren = [];
		newRoot.eachNode(function (node) {
			newChildren.push(node);
		});
		var oldChildren = this._oldChildren || [];
		dualTravel(newChildren, oldChildren);
		renderRollUp(virtualRoot, newRoot);

		this._initEvents();

		this._oldChildren = newChildren;

		function dualTravel(newChildren, oldChildren) {
			if (newChildren.length === 0 && oldChildren.length === 0) {
				return;
			}

			new DataDiffer(oldChildren, newChildren, getKey, getKey).add(processNode).update(processNode).remove(zrUtil.curry(processNode, null)).execute();

			function getKey(node) {
				return node.getId();
			}

			function processNode(newIdx, oldIdx) {
				var newNode = newIdx == null ? null : newChildren[newIdx];
				var oldNode = oldIdx == null ? null : oldChildren[oldIdx];
				doRenderNode(newNode, oldNode);
			}
		}

		function doRenderNode(newNode, oldNode) {
			if (!renderLabelForZeroData && newNode && !newNode.getValue()) {
				// Not render data with value 0
				newNode = null;
			}

			if (newNode !== virtualRoot && oldNode !== virtualRoot) {
				if (oldNode && oldNode.piece) {
					if (newNode) {
						// Update
						oldNode.piece.updateData(false, newNode, seriesModel, ecModel, api); // For tooltip

						data.setItemGraphicEl(newNode.dataIndex, oldNode.piece);
					} else {
						// Remove
						removeNode(oldNode);
					}
				} else if (newNode) {
					// Add
					var piece = new SunburstPiece(newNode, seriesModel, ecModel, api);
					group.add(piece); // For tooltip

					data.setItemGraphicEl(newNode.dataIndex, piece);
				}
			}
		}

		function removeNode(node) {
			if (!node) {
				return;
			}

			if (node.piece) {
				group.remove(node.piece);
				node.piece = null;
			}
		}

		function renderRollUp(virtualRoot, viewRoot) {
			if (viewRoot.depth > 0) {
				// Render
				if (self.virtualPiece) {
					// Update
					self.virtualPiece.updateData(false, virtualRoot, seriesModel, ecModel, api);
				} else {
					// Add
					self.virtualPiece = new SunburstPiece(virtualRoot, seriesModel, ecModel, api);
					group.add(self.virtualPiece);
				} // TODO event scope

				viewRoot.piece.off('click');
				self.virtualPiece.on('click', function (e) {
					self._rootToNode(viewRoot.parentNode);
				});
			} else if (self.virtualPiece) {
				// Remove
				group.remove(self.virtualPiece);
				self.virtualPiece = null;
			}
		}
	};
	/**
   * @private
   */

	SunburstView.prototype._initEvents = function () {
		var _this = this;

		this.group.off('click');
		this.group.on('click', function (e) {
			var targetFound = false;

			var viewRoot = _this.seriesModel.getViewRoot();

			viewRoot.eachNode(function (node) {
				if (!targetFound && node.piece && node.piece === e.target) {
					var nodeClick = node.getModel().get('nodeClick');

					if (nodeClick === 'rootToNode') {
						_this._rootToNode(node);
					} else if (nodeClick === 'link') {
						var itemModel = node.getModel();
						var link = itemModel.get('link');

						if (link) {
							var linkTarget = itemModel.get('target', true) || '_blank';
							windowOpen(link, linkTarget);
						}
					}

					targetFound = true;
				}
			});
		});
	};
	/**
   * @private
   */

	SunburstView.prototype._rootToNode = function (node) {
		if (node !== this.seriesModel.getViewRoot()) {
			this.api.dispatchAction({
				type: ROOT_TO_NODE_ACTION,
				from: this.uid,
				seriesId: this.seriesModel.id,
				targetNode: node
			});
		}
	};
	/**
   * @implement
   */

	SunburstView.prototype.containPoint = function (point, seriesModel) {
		var treeRoot = seriesModel.getData();
		var itemLayout = treeRoot.getItemLayout(0);

		if (itemLayout) {
			var dx = point[0] - itemLayout.cx;
			var dy = point[1] - itemLayout.cy;
			var radius = Math.sqrt(dx * dx + dy * dy);
			return radius <= itemLayout.r && radius >= itemLayout.r0;
		}
	};

	SunburstView.type = 'sunburst';
	return SunburstView;
}(ChartView);

export default SunburstView;